package com.hingsmy.pma.logging;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.persistence.AssociationOverride;
import java.lang.reflect.Array;
import java.util.Arrays;

@Aspect
@Component
public class ApplicationLoggerAspect {
    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Pointcut("within(com.hingsmy.pma.controllers..*)"+"|| within(com.hingsmy.pma.dao..*)")
    public void definePackagePointcut(){

    }

/*
    @Before("definePackagePointcut()")
    public void logBefore(JoinPoint joinPoint){
        log.debug("\n\n\n");
        log.debug("******************方法输入前*******************");
        log.debug(
                "{},{}() 输入参数{}",
                joinPoint.getSignature().getDeclaringTypeName(),
                joinPoint.getSignature().getName(),
                Arrays.toString(joinPoint.getArgs())
        );
        log.debug("----------------------------------------------");
        log.debug("\n\n\n");
    }

    @After("definePackagePointcut()")
    public void logAfter(JoinPoint joinPoint){
        log.debug("\n\n\n");
        log.debug("*****************方法执行后*********************");
        log.debug(
                "{},{}() 输入参数{}",
                joinPoint.getSignature().getDeclaringTypeName(),
                joinPoint.getSignature().getName(),
                Arrays.toString(joinPoint.getArgs())
        );
        log.debug("----------------------------------------------");
        log.debug("\n\n\n");
    }
*/

    @Around("definePackagePointcut()")
    public Object logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        log.debug("\n\n\n");
        log.debug("*****************方法执行前*********************");
        log.debug(
                "{},{}() 输入参数{}",
                proceedingJoinPoint.getSignature().getDeclaringTypeName(),
                proceedingJoinPoint.getSignature().getName(),
                Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("----------------------------------------------");
        log.debug("\n\n\n");

        Object object=proceedingJoinPoint.  proceed();

        log.debug("\n\n\n");
        log.debug("*****************方法执行后*********************");
        log.debug(
                "{},{}() 输入参数{}",
                proceedingJoinPoint.getSignature().getDeclaringTypeName(),
        proceedingJoinPoint.getSignature().getName(),
        Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("----------------------------------------------");
        log.debug("\n\n\n");

        return object;
    }
}
